package com.sheng.leetcode.year2023.swordfingerofferspecial.day02;

import org.junit.Test;

import java.util.Arrays;

/**
 * @author liusheng
 * @date 2023/03/02
 * <p>
 * 剑指 Offer II 006. 排序数组中两个数字之和<p>
 * <p>
 * 给定一个已按照 升序排列  的整数数组 numbers ，请你从数组中找出两个数满足相加之和等于目标数 target 。<p>
 * 函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 0 开始计数 ，<p>
 * 所以答案数组应当满足 0 <= answer[0] < answer[1] < numbers.length 。<p>
 * 假设数组中存在且只存在一对符合条件的数字，同时一个数字不能使用两次。<p>
 * <p>
 * 示例 1：<p>
 * 输入：numbers = [1,2,4,6,10], target = 8<p>
 * 输出：[1,3]<p>
 * 解释：2 与 6 之和等于目标数 8 。因此 index1 = 1, index2 = 3 。<p>
 * <p>
 * 示例 2：<p>
 * 输入：numbers = [2,3,4], target = 6<p>
 * 输出：[0,2]<p>
 * <p>
 * 示例 3：<p>
 * 输入：numbers = [-1,0], target = -1<p>
 * 输出：[0,1]<p>
 * <p>
 * 提示：<p>
 * 2 <= numbers.length <= 3 * 10^4<p>
 * -1000 <= numbers[i] <= 1000<p>
 * numbers 按 递增顺序 排列<p>
 * -1000 <= target <= 1000<p>
 * 仅存在一个有效答案<p>
 * <p>
 * 注意：本题与主站 167 题相似（下标起点不同）：<a href="https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted/">主站 167</a><p>
 * <p>
 * 来源：力扣（LeetCode）<p>
 * 链接：<a href="https://leetcode.cn/problems/kLl5u1">剑指 Offer II 006. 排序数组中两个数字之和</a><p>
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。<p>
 */
public class Sword006 {

    @Test
    public void test01() {
//        int[] numbers = {1, 2, 4, 6, 10};
//        int target = 8;
//        int[] numbers = {2, 3, 4};
//        int target = 6;
        int[] numbers = {-1, 0};
        int target = -1;
        System.out.println(Arrays.toString(new Solution006().twoSum(numbers, target)));
    }
}

class Solution006 {
    public int[] twoSum(int[] numbers, int target) {
//        int[] nums = new int[2];
//        for (int i = 0; i < numbers.length; i++) {
//            int one = target - numbers[i];
//            for (int j = 0; j < numbers.length; j++) {
//                if (i != j && one == numbers[j]) {
//                    nums[0] = Math.min(i, j);
//                    nums[1] = Math.max(i, j);
//                    return nums;
//                }
//            }
//        }
//        return nums;
        // 双指针
        int i = 0, j = numbers.length - 1;
        while (i < j) {
            int sum = numbers[i] + numbers[j];
            if (sum < target) {
                i++;
            } else if (sum > target) {
                j--;
            } else {
                return new int[]{i, j};
            }
        }
        return new int[]{-1, -1};
    }
}
